前兩天練習了 getBy**
系列,取得單一 DOM node。
若要一次取得多個 DOM nodes,我們可以快速使用以下表格直接舉一反八:
Priority Query Order | 取得 單一節點 | 取得 多個節點 | 用途 |
---|---|---|---|
1. | getByRole |
getAllByRole |
依據 屬性 role 取得對應 DOM node。 |
2. | getByLabelText |
getAllByLabelText |
依據 <label> text value 取得對應 DOM node。 |
3. | getByPlaceholderText |
getAllByPlaceholderText |
依據 placeholder text value 取得對應 DOM node。 |
4. | getByText |
getAllByText |
依據 HTML Element text value 取得對應 DOM node。 |
5. | getByDisplayValue |
getAllByDisplayValue |
依據 HTML Element 預設值 或 模擬更新值 取得對應 DOM node。 |
6. | getByAltText |
getAllByAltText |
依據 屬性 alt 取得對應 DOM node。 |
7. | getByTitle |
getAllByTitle |
依據 屬性 title 取得對應 DOM node。 |
8. | getByTestId |
getAllByTestId |
依據 自定義屬性 data-testid 取得對應 DOM node。 |
以 getAllByRole
為例:我的 component 有一個列表內容。
export default function Hobbies({hobbies}: {hobbies: string[]}){
return(
<ul>
{hobbies.map(item => (
<li key={item}>{item}</li>
))}
</ul>
)
}
撰寫測試:
import { render, screen } from "@testing-library/react";
import Hobbies from "./hobbies";
describe("Hobbies", () => {
// 檢查 <ul> 單一節點
test("Render List correctlly!", () => {
const hobbies = ["Sleeping", "Cooking", "Eating"];
render(<Hobbies hobbies={hobbies}/>);
const listEl = screen.getByRole("list");
expect(listEl).toBeInTheDocument();
})
// 檢查 <li> 多個節點
test("Render Listitems correctlly!", () => {
const hobbies = ["Sleeping", "Cooking", "Eating"];
render(<Hobbies hobbies={hobbies}/>);
const listItemElements = screen.getAllByRole("listitem");
expect(listItemElements).toHaveLength(hobbies.length);
})
})
測試結果:
PASS src/components/hobbies/hobbies.test.tsx
Hobbies
✓ Render List correctlly! (28 ms)
✓ Render Listitems correctlly! (9 ms)Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 0.448 s, estimated 1 s